]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
panel: Add an easier way of adding items to the system status area
authorGiovanni Campagna <gcampagna@src.gnome.org>
Mon, 22 Aug 2011 21:19:13 +0000 (23:19 +0200)
committerJasper St. Pierre <jstpierre@mecheye.net>
Thu, 25 Aug 2011 17:34:45 +0000 (13:34 -0400)
Extensions often want to add items to the system status area, so it
is useful to add a convenience API for it. Also, we now allow
for cleaner destruction of panel objects, by just calling destroy()
on it.
Based on a patch by Jasper St. Pierre.

https://bugzilla.gnome.org/show_bug.cgi?id=653205

js/ui/panel.js
js/ui/panelMenu.js

index 91adc4cea20765a9464f2b9de698ba27c93503e2..2fa00ced981842b93eec5f9c5f22c193dd24b3aa 100644 (file)
@@ -962,11 +962,9 @@ Panel.prototype = {
                 // This icon is not implemented (this is a bug)
                 continue;
             }
-            let indicator = new constructor();
-            this._statusBox.add(indicator.actor);
-            this._menus.addMenu(indicator.menu);
 
-            this._statusArea[role] = indicator;
+            let indicator = new constructor();
+            this.addToStatusArea(role, indicator, i-1);
         }
 
         // PopupMenuManager depends on menus being added in order for
@@ -974,6 +972,28 @@ Panel.prototype = {
         this._menus.addMenu(this._userMenu.menu);
     },
 
+    addToStatusArea: function(role, indicator, position) {
+        if (this._statusArea[role])
+            throw new Error('Extension point conflict: there is already a status indicator for role ' + role);
+
+        if (!(indicator instanceof PanelMenu.Button))
+            throw new TypeError('Status indicator must be an instance of PanelMenu.Button');
+
+        if (!position)
+            position = 0;
+
+        this._statusBox.insert_actor(indicator.actor, position);
+        this._menus.addMenu(indicator.menu);
+
+        this._statusArea[role] = indicator;
+        let destroyId = indicator.connect('destroy', Lang.bind(this, function(emitter) {
+            this._statusArea[role] = null;
+            emitter.disconnect(destroyId);
+        }));
+
+        return indicator;
+    },
+
     startupAnimation: function() {
         let oldY = this.actor.y;
         this.actor.y = oldY - this.actor.height;
index 5e9a191ead520020177a72af7bfa6022129f7815..44e2078b8b23a350715167a39d6076a2ac57a670 100644 (file)
@@ -2,6 +2,7 @@
 
 const Clutter = imports.gi.Clutter;
 const Gtk = imports.gi.Gtk;
+const Signals = imports.signals;
 const St = imports.gi.St;
 
 const Lang = imports.lang;
@@ -80,8 +81,18 @@ Button.prototype = {
             this.actor.add_style_pseudo_class('active');
         else
             this.actor.remove_style_pseudo_class('active');
+    },
+
+    destroy: function() {
+        this.actor._delegate = null;
+
+        this.menu.destroy();
+        this.actor.destroy();
+
+        this.emit('destroy');
     }
 };
+Signals.addSignalMethods(Button.prototype);
 
 /* SystemStatusButton:
  *